package net.juantxu.pentaho.launcher;

import java.io.File;
import java.util.Properties;
import java.util.ResourceBundle;

import net.juantxu.pentaho.launcher.utilidades.BorraDirectorio;
import net.juantxu.pentaho.launcher.utilidades.CargaProperties;
import net.juantxu.pentaho.launcher.utilidades.CopiaArchivos;
import net.juantxu.pentaho.launcher.utilidades.EscribeProperties;
import net.juantxu.pentaho.launcher.utilidades.GetOs;
import net.juantxu.pentaho.launcher.utilidades.RecreaDirectorioPluginSamples;

import org.apache.log4j.Logger;

public class DescargaEInstalaPentahoApp {
	Properties prop;
	static ResourceBundle messages;
	static Logger log = Logger.getLogger(DescargaEInstalaPentahoApp.class);

	DescargaEInstalaPentahoApp(String app) {
		prop = new CargaProperties().Carga();
		log.info("descargando aplicación de pentaho");

		if (app.equals("kettle")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("kettleWin"));
				ubica("integration");
			} else {
				new Descargador().descargaNix(prop.getProperty("kettleNix"));
			}
			registra("data-integration", "dataIntegrationRelativePath");
		} else if (app.equals("workbench")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("workbenchWin"));
				ubica("workbench");
			} else {
				new Descargador().descargaNix(prop.getProperty("workbenchNix"));
			}
			registra("workbench", "workbenchRelativePath");
		} else if (app.equals("aggregation")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("aggregationWin"));
				ubica("aggregation");
			} else {
				new Descargador().descargaNix(prop.getProperty("aggregationNix"));
			}
			registra("aggregation", "aggregationRelativePath");
		} else if (app.equals("metadata")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("metadataWin"));
				ubica("metadata");
			} else {
				new Descargador().descargaNix(prop.getProperty("metadataNix"));
			}
			registra("metadata", "metadataRelativePath");
			
			
		} else if (app.equals("reportDesigner")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("reportWin"));
				ubica("report");
			} else {
				new Descargador().descargaNix(prop.getProperty("reportNix"));
			}
			registra("report", "reportDesingerRelativePath");
			
			
		} else if (app.equals("designStudio")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("designStudioWin"));
				ubica("design");
				registra("design-studio", "designStudioRelativePathWin");
			} else {
				new Descargador().descargaNix(prop.getProperty("designStudioNix"));
				registra("design-studio", "designStudioRelativePathNix");
			}
			
		} else if (app.equals("weka")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("wekaWin"));
				ubica("weka");
			} else {
				new Descargador().descargaNix(prop.getProperty("wekaWin"));
				ubica("weka");
			}
			registra("weka", "wekaRelativePath");
			
			
		} else if (app.equals("bis")) {
			if (new GetOs().Get().equals("win")) {
				new Descargador().descargaWin(prop.getProperty("biServerWin"));
				ubica("server");
				ubica("admin");
				borraPrompt();
			} else {
				new Descargador().descargaNix(prop.getProperty("biServerNix"));
				borraPrompt();
			}
			registra("biserver", "biserverRelativePath");
			registra("administration", "adminConsoleRelativePath");
			
			
		} else if (app.equals("extra")) {
			if (new GetOs().Get().equals("win")) {	

				new Descargador().descargaWin(prop.getProperty("CDA"));
				ubicaEnPentahoSolutions("CDA");

				new Descargador().descargaWin(prop.getProperty("CDF"));
				ubicaEnPentahoSolutions("CDF");
				
				new Descargador().descargaWin(prop.getProperty("CDE"));
				ubicaEnPentahoSolutions("CDE");
				
				new Descargador().descargaWin(prop.getProperty("SAIKU"));
				ubicaEnPentahoSolutions("SAIKU");
				new Descargador().descargaWin(prop.getProperty("SAIKUADHOC"));
				ubicaEnPentahoSolutions("SAIKUADHOC");
				
				new RecreaDirectorioPluginSamples(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/plugin-samples/");
				
				new Descargador().descargaWin(prop.getProperty("CDA_SAMPLES"));
				ubicaEnPentahoSolutions("CDA_SAMPLES");	
				
				new Descargador().descargaWin(prop.getProperty("CDE_SAMPLES"));
				ubicaEnPentahoSolutions("CDE_SAMPLES");		
				
				new Descargador().descargaWin(prop.getProperty("CDF_SAMPLES"));
				ubicaEnPentahoSolutions("CDF_SAMPLES");	
			} else {
				new Descargador().descargaNix(prop.getProperty("CDA"));
				ubicaEnPentahoSolutions("CDA");
				
				new Descargador().descargaNix(prop.getProperty("CDF"));
				ubicaEnPentahoSolutions("CDF");
				
				new Descargador().descargaNix(prop.getProperty("CDE"));
				ubicaEnPentahoSolutions("CDE");
				
				new Descargador().descargaNix(prop.getProperty("SAIKU"));
				ubicaEnPentahoSolutions("SAIKU");

				new Descargador().descargaNix(prop.getProperty("SAIKUADHOC"));
				ubicaEnPentahoSolutions("SAIKUADHOC");
				
				new RecreaDirectorioPluginSamples(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/plugin-samples/");
				
				new Descargador().descargaNix(prop.getProperty("CDA_SAMPLES"));
				ubicaEnPentahoSolutions("CDA_SAMPLES");	
				
				new Descargador().descargaNix(prop.getProperty("CDE_SAMPLES"));
				ubicaEnPentahoSolutions("CDE_SAMPLES");		
				
				new Descargador().descargaNix(prop.getProperty("CDF_SAMPLES"));
				ubicaEnPentahoSolutions("CDF_SAMPLES");	
			}
			
			
		}
	}
	
	

	
	
	private void borraPrompt(){
		File f =  new File(prop.getProperty("biserverRelativePath") + "/promptuser.sh");
		if (f.exists()){
			log.debug("borrando "+f.getAbsolutePath());
			f.delete();
		}
		
	}

	private void registra(String path, String clave) {
		log.debug("registrando aplicacion" + path);
		File f = new File("pentahoApps");
		String[] lista = f.list();
		for (int i = 0; i < lista.length; i++) {
			log.debug(lista[i]);
			if (lista[i].contains(path) && (new File("pentahoApps/"+lista[i]).isDirectory() ) ) {
				log.info("registrando " + lista[i] + " en " + clave);
				new EscribeProperties(clave, "pentahoApps/" + lista[i]);
			}
		}

	}
	private void ubica(String app){
		File f = new File(".");
		String[] lista = f.list();
		for (int i = 0; i < lista.length; i++) {
			if (lista[i].contains(app)  && (new File(lista[i]).isDirectory() )) {
				log.info("Miviendo y ubicando:  " + lista[i] );
				mueve(lista[i], "pentahoApps/"+lista[i]);
			}
		}
		
		
	}
	/*
	 * Ubica en poentaho solutions.... para las ctools.
	 */
	private void ubicaEnPentahoSolutions(String componente){
		
		if (componente =="CDA"){
			// CDA
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/system/cda");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("CDA antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar CDA antiguo");
				}
			}
			// muevo CDA 
			f = new File("cda");
			log.info("Miviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
		
		
		}else if(componente =="CDF"){
			//CDF
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/system/pentaho-cdf");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("pentaho-cdf antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar pentaho-cdf antiguo");
				}
			}
			// muevo pentaho-cdf 
			f = new File("pentaho-cdf");
			log.info("Moviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
			
			
		}else if(componente =="CDF_SOLUTION"){
			//CDF
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/cdf");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("cdf antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar pentaho-cdf antiguo");
				}
			}
			// muevo cdf 
			f = new File("cdf");
			log.info("Moviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());			
			

		}else if(componente =="CDE"){
			//CDE
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/system/pentaho-cdf-dd");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("pentaho-cdf-dd antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar pentaho-cdf-dd antiguo");
				}
			}
			// muevo pentaho-cdf 
			f = new File("pentaho-cdf-dd");
			log.info("Miviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
			
		}else if(componente =="SAIKU"){
			//SAIKU
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/system/saiku");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("saiku antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar saiku antiguo");
				}
			}
			// muevo pentaho-cdf 
			f = new File("saiku");
			log.info("Miviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
			
			
		}else if(componente =="SAIKUADHOC"){
			//SAIKUADHOC
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/system/saiku-adhoc");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("saiku adhoc antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar saiku adhoc antiguo");
				}
			}
			// muevo pentaho-cdf 
			f = new File("saiku-adhoc");
			log.info("Miviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
			log.info("Updatig pentaho reporting cda extensions");
			String SAHorigen =  prop.getProperty("biserverRelativePath") + "/pentaho-solutions/system/saiku-adhoc/lib/pentaho-reporting-engine-classic-extensions-cda-saiku-SNAPSHOT.jar";
			String SAHdestino =  prop.getProperty("biserverRelativePath") + "/tomcat/webapps/pentaho/WEB-INF/lib/pentaho-reporting-engine-classic-extensions-cda-saiku-SNAPSHOT.jar";
			new CopiaArchivos(SAHorigen, SAHdestino  );
			
			
			
			
			
		
		/*
		 *  Ejemplos
		 */
		}else if(componente =="CDA_SAMPLES"){
			//CDA_SAMPLES
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/plugin-samples/cda");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("cda antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar saiku antiguo");
				}
			}
			// muevo cda
			f = new File("cda");
			log.info("Miviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
			
			
		}else if(componente =="CDE_SAMPLES"){
			//CDE_SAMPLES
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/plugin-samples/pentaho-cdf-dd");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("cde antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar cde samples antiguo");
				}
			}
			// muevo cde
			f = new File("pentaho-cdf-dd");
			log.info("Miviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
			
		}else if(componente =="CDF_SAMPLES"){
			//CDF_SAMPLES
			File f = new File(".");
			File ff = new File(prop.getProperty("biserverRelativePath") + "/pentaho-solutions/plugin-samples/pentaho-cdf");
			if (ff.exists() ) { 
				if (new BorraDirectorio().borrar(ff.getAbsolutePath())){ 
					log.info("cdf antiguo BORRADO");
				}else{
					log.debug("No se ha podido borrar cdf antiguo");
				}
			}
			// muevo cde
			f = new File("pentaho-cdf");
			log.info("Miviendo y ubicando:  " + f.getAbsolutePath() );
			mueve(f.getAbsolutePath(),ff.getAbsolutePath());
					
		} 		 	
		
		
		
	}

	
	
	 public void mueve(String fromDir, String toDir) {
		    File from = new File(fromDir);
		    if (!from.exists() || !from.isDirectory()) {
		      log.error("El directorio no existe: " + fromDir);
		      return;
		    }
		    File to = new File(toDir);
		    //Rename
		    if (from.renameTo(to)){
		      log.info(fromDir + " movido a " +toDir);
		    }else{
		      log.error("Error moviendo el archivo");
		  }

	
	 }	
}